home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 October
/
EnigmA AMIGA RUN 22 (1997)(G.R. Edizioni)(IT)[!][issue 1997-10 & 11][EAR-CD VI].iso
/
recent2
/
scaler.lha
/
scaler.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-08
|
11KB
|
494 lines
/*
Scaler: A Bars and Pipes tool for scaling control change values.
Copyright (C) 1997 Richard Hagen
This code is released into the Public Domain, and may be freely
distributed in its original form.
It is supplied ``as is'', and comes with no warranty.
This program code was released because it might be useful as a
starting point for other programmers. However, if any damage arises
from its use, the original author will not be held liable.
You are free to use and modify this code to your heart's content,
provided you acknowledge me as the original author in any code
that you might distribute which is based largely on this code.
I acknowledge that the design of this accessory is influenced
strongly by the example code supplied with the Rules for Tools
package. However, I have made substantial contributions of my
own.
Richard Hagen
R.Hagen@mailbox.uq.edu.au
History:
Version 1.0 (8 September 1997)
Initial release.
*/
#include "bars.h"
#include <libraries/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <exec/memory.h>
#include <string.h>
#include <intuition/intuition.h>
#include "myheader.h"
#define SCALER_NAME "Scaler"
#define SCALER_ID MAKE_IDS("CCSC")
#define SCALER_TYPE (TOOL_NORMAL)
__chip static UWORD scaler[] = {
/*------ plane # 0: --------*/
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0f00, 0x7800,
0x1000, 0x8000,
0x1000, 0x8000,
0x1000, 0x8000,
0x0f00, 0x7000,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
/*------ plane # 1: --------*/
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0f00, 0x7800,
0x1000, 0x8000,
0x1000, 0x8000,
0x1000, 0x8000,
0x0f00, 0x7000,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
/*------ plane # 2: --------*/
0x0, 0x0,
0x0018, 0x0,
0x03ff, 0xc000,
0x0618, 0x6000,
0x0f18, 0xf800,
0x1918, 0x9000,
0x1099, 0x8800,
0x305a, 0x8400,
0x1f99, 0xf800,
0x003c, 0x0,
0x0, 0x0,
0x0, 0x0,
};
static struct Image scaler_image = {
0,0,
24 , 12 , 3 ,
&scaler[0],
0x1f,0x00,
NULL
};
struct ScalerTool {
struct Tool tool;
UBYTE controller; /* The Control Change number that we're scaling. */
UBYTE min; /* The minimum value. */
UBYTE max; /* The maximum value. */
};
static struct ToolMaster master;
extern struct Functions *functions;
#define INIT_CC 10
#define INIT_MIN 0
#define INIT_MAX 127
static void
scaler_init(struct ScalerTool *tool)
{
tool->tool.touched = TOUCH_INIT;
tool->controller = INIT_CC;
tool->min = INIT_MIN;
tool->max = INIT_MAX;
}
#define SCALER_CC_GADGET 1
#define SCALER_CCDOWN_GADGET 2
#define SCALER_CCUP_GADGET 3
#define SCALER_MIN_GADGET 4
#define SCALER_MINDOWN_GADGET 5
#define SCALER_MINUP_GADGET 6
#define SCALER_MAX_GADGET 7
#define SCALER_MAXDOWN_GADGET 8
#define SCALER_MAXUP_GADGET 9
/* CC# gadget. */
struct PropInfo ScalerScalerGadget1SInfo = {
AUTOKNOB+FREEHORIZ,
-16384, -1,
16384, -1,
};
struct Image ScalerImage1 = {
0,0,
102,6,
0,
NULL,
0x0000,0x0000,
NULL
};
struct IntuiText ScalerIText1 = {
2,0,JAM1,
-55,1,
NULL,
"CC #:",
NULL
};
struct Gadget ScalerGadget1 = {
NULL,
65,14,
100,10,
GFLG_GADGHBOX|GFLG_GADGHIMAGE,
RELVERIFY|GADGIMMEDIATE,
PROPGADGET,
(APTR)&ScalerImage1,
NULL,
&ScalerIText1,
NULL,
(APTR)&ScalerScalerGadget1SInfo,
SCALER_CC_GADGET,
NULL
};
/* Min gadget. */
struct PropInfo ScalerScalerGadget2SInfo = {
AUTOKNOB+FREEHORIZ,
-16384, -1,
16384, -1,
};
struct Image ScalerImage2 = {
0,0,
102,6,
0,
NULL,
0x0000,0x0000,
NULL
};
struct IntuiText ScalerIText2 = {
2,0,JAM1,
-54,1,
NULL,
"Min: ",
NULL
};
struct Gadget ScalerGadget2 = {
&ScalerGadget1,
65,26,
100,10,
GFLG_GADGHBOX|GFLG_GADGHIMAGE,
RELVERIFY|GADGIMMEDIATE,
PROPGADGET,
(APTR)&ScalerImage2,
NULL,
&ScalerIText2,
NULL,
(APTR)&ScalerScalerGadget2SInfo,
SCALER_MIN_GADGET,
NULL
};
/* Max gadget. */
struct PropInfo ScalerScalerGadget3SInfo = {
AUTOKNOB+FREEHORIZ,
-16384, -1,
16384, -1,
};
struct Image ScalerImage3 = {
0,0,
102,6,
0,
NULL,
0x0000,0x0000,
NULL
};
struct IntuiText ScalerIText3 = {
2,0,JAM1,
-54,1,
NULL,
"Max: ",
NULL
};
struct Gadget ScalerGadget3 = {
&ScalerGadget2,
65,38,
100,10,
GFLG_GADGHBOX|GFLG_GADGHIMAGE,
RELVERIFY|GADGIMMEDIATE,
PROPGADGET,
(APTR)&ScalerImage3,
NULL,
&ScalerIText3,
NULL,
(APTR)&ScalerScalerGadget3SInfo,
SCALER_MAX_GADGET,
NULL
};
#define ScalerGadgetList1 ScalerGadget3
struct NewWindow ScalerNewWindowStructure1 = {
75,85,
203, 52,
0,6,
GADGETDOWN+GADGETUP+CLOSEWINDOW,
WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH,
&ScalerGadget3,
NULL,
"Scaler",
NULL,
NULL,
5,5,
-1,-1,
CUSTOMSCREEN
};
/* Writes the value of a proportional slider. Thank goodness
all the Scaler sliders are identical in range and behaviour! */
__geta4 /* Callback. */
long display_routine(struct Window *window, /* Window where the gadget lives. */
struct Gadget *gadget, /* The gadget itself. */
unsigned long value) /* The value to display. */
{
char text[10];
struct RastPort *rp = window->RPort;
Move(rp, 170, 21 + ((gadget->GadgetID - 1) / 3) * 12);
SetAPen(rp, 1);
SetBPen(rp, 0);
SetDrMd(rp, JAM2);
sprintf(text, "%3ld", value);
Text(rp, text, 3);
return value;
}
__geta4 /* Callback. */
static struct Event *
processeventcode(struct Event *event)
{
if (event->type == EVENT_VOICE &&
event->status == MIDI_CCHANGE)
{
struct ScalerTool *tool = (struct ScalerTool *) event->tool;
if (event->byte1 == tool->controller)
{
const short diff = tool->max - tool->min;
if (diff > 0)
{
event->byte2 = ((event->byte2 * (diff + 1)) >> 7) + tool->min;
}
else if (diff < 0)
{
event->byte2 = tool->min - ((event->byte2 * (1 - diff)) >> 7);
}
else if (diff == 0)
{
event->byte2 = tool->min;
}
}
}
event->tool = event->tool->next;
return(event);
}
static long
drag_embossed_prop(struct Window *window,
short id)
{
const long value = (*functions->DragEmbossedProp)(window, id);
(*functions->DrawEmbossedProp)(window, id);
return value;
}
static long
shift_embossed_prop(struct Window *window,
short id,
short shift)
{
const long value = (*functions->ShiftEmbossedProp)(window, id, shift, 0);
(*functions->DrawEmbossedProp)(window, id);
return value;
}
__geta4 /* Callback. */
void
edittoolcode(struct ScalerTool *tool)
{
struct IntuiMessage *message;
struct Window *window;
long class, code;
struct Gadget *gadget;
struct NewWindow *newwindow;
ScalerNewWindowStructure1.Screen = functions->screen;
if (tool->tool.touched & TOUCH_EDIT)
{
ScalerNewWindowStructure1.LeftEdge = tool->tool.left;
ScalerNewWindowStructure1.TopEdge = tool->tool.top;
ScalerNewWindowStructure1.Width = tool->tool.width;
ScalerNewWindowStructure1.Height = tool->tool.height;
}
if (!tool->tool.touched)
{
scaler_init(tool);
}
newwindow = (struct NewWindow *)
(*functions->DupeNewWindow)(&ScalerNewWindowStructure1);
if (!newwindow)
{
return;
}
newwindow->Title = 0;
newwindow->Flags |= BORDERLESS;
newwindow->Flags &= ~0xF;
newwindow->BlockPen = 0;
newwindow->DetailPen = 0;
window = (struct Window *) (*functions->FlashyOpenWindow)(newwindow);
if (!window)
{
return;
}
tool->tool.window = window;
(*functions->EmbossWindowOn)(window,WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG,
SCALER_NAME,(short)-1,(short)-1,0,0);
for (short i = SCALER_CC_GADGET;
i <= SCALER_MAX_GADGET;
i += 3)
{
(*functions->FatEmbossedPropOn)(window,i, i + 1, i + 2,
(no_prototype) display_routine,
128, 1);
}
(*functions->ModifyEmbossedProp)(window, SCALER_CC_GADGET,
tool->controller, 0, 0, 0, 0, 0);
(*functions->ModifyEmbossedProp)(window, SCALER_MIN_GADGET,
tool->min, 0, 0, 0, 0, 0);
(*functions->ModifyEmbossedProp)(window, SCALER_MAX_GADGET,
tool->max, 0, 0, 0, 0, 0);
for (short i = SCALER_CC_GADGET;
i <= SCALER_MAX_GADGET;
i += 3)
{
(*functions->DrawEmbossedProp)(window, i);
}
for (;;)
{
message = (struct IntuiMessage *) (*functions->GetIntuiMessage)(window);
class = message->Class;
code = message->Code;
gadget = (struct Gadget *) message->IAddress;
class = (*functions->SystemGadgets)(window,class,gadget,code);
ReplyMsg((struct Message *)message);
if (class == CLOSEWINDOW)
{
break;
}
else if (class == GADGETDOWN)
{
const short id = gadget->GadgetID;
switch (id)
{
case SCALER_CC_GADGET:
tool->controller = (UBYTE) drag_embossed_prop(window, SCALER_CC_GADGET);
break;
case SCALER_CCDOWN_GADGET:
tool->controller = (UBYTE) shift_embossed_prop(window, SCALER_CC_GADGET, -1);
break;
case SCALER_CCUP_GADGET:
tool->controller = (UBYTE) shift_embossed_prop(window, SCALER_CC_GADGET, 1);
break;
case SCALER_MIN_GADGET:
tool->min = (UBYTE) drag_embossed_prop(window, SCALER_MIN_GADGET);
break;
case SCALER_MINDOWN_GADGET:
tool->min = (UBYTE) shift_embossed_prop(window, SCALER_MIN_GADGET, -1);
break;
case SCALER_MINUP_GADGET:
tool->min = (UBYTE) shift_embossed_prop(window, SCALER_MIN_GADGET, 1);
break;
case SCALER_MAX_GADGET:
tool->max = (UBYTE) drag_embossed_prop(window, SCALER_MAX_GADGET);
break;
case SCALER_MAXDOWN_GADGET:
tool->max = (UBYTE) shift_embossed_prop(window, SCALER_MAX_GADGET, -1);
break;
case SCALER_MAXUP_GADGET:
tool->max = (UBYTE) shift_embossed_prop(window, SCALER_MAX_GADGET, 1);
break;
}
}
else if (class == GADGETDOWN)
{
/* Nothing. */
}
}
tool->tool.window = 0;
tool->tool.left = window->LeftEdge;
tool->tool.top = window->TopEdge;
tool->tool.width = window->Width;
tool->tool.height = window->Height;
tool->tool.touched = TOUCH_INIT | TOUCH_EDIT;
for (short i = SCALER_CC_GADGET;
i <= SCALER_MAX_GADGET;
i += 3)
{
(*functions->FatEmbossedPropOff)(window, i, i + 1, i + 2);
}
(*functions->EmbossWindowOff)(window);
(*functions->FlashyCloseWindow)(window);
(*functions->DeleteNewWindow)(newwindow);
}
struct ToolMaster *
inittoolmaster()
{
memset((char *)&master,0,sizeof(struct ToolMaster));
master.toolid = SCALER_ID;
master.image = &scaler_image;
strcpy(master.name, SCALER_NAME);
master.edittool = (void_prototype) edittoolcode;
master.processevent = (event_prototype) processeventcode;
master.tooltype = SCALER_TYPE;
master.toolsize = sizeof(struct ScalerTool);
return(&master);
}